home *** CD-ROM | disk | FTP | other *** search
- Joe Celko & Michael Smith
- Sunset Blvd #304
- Los Angeles, CA 90069
- service: (213) 288-9690
-
- 325 words
-
-
-
-
-
- CHECK DIGIT PROGRAMS
-
- The following Pascal functions will compute the different check
- digits given in the article. They assume that the program has
- the following declarations global to them. N can be replaced by
- a literal value in all of the programs for a particular
- application, so these are more templates than programs. The
- InfoDigits data type assumes that the number to be given a check
- digit is stored in an array of integers, with the leftmost digit
- in position one.
-
- CONST
- N = 10; { size of information digits string }
- TYPE
- InfoDigits = ARRAY [1..N] OF INTEGER;
-
- FUNCTION MakeCheck(a : InfoDigits; n : INTEGER) : INTEGER;
- { This will generate Verhoeff's Dihedral Five check digit }
- CONST
- MultTable : ARRAY [0..9, 0..9] OF INTEGER =
- (( 0, 1, 2, 3, 4, 5, 6, 7, 8, 9),
- ( 1, 2, 3, 4, 0, 6, 7, 8, 9, 5),
- ( 2, 3, 4, 0, 1, 7, 8, 9, 5, 6),
- ( 3, 4, 0, 1, 2, 8, 9, 5, 6, 7),
- ( 4, 0, 1, 2, 3, 9, 5, 6, 7, 8),
- ( 5, 9, 8, 7, 6, 0, 4, 3, 2, 1),
- ( 6, 5, 9, 8, 7, 1, 0, 4, 3, 2),
- ( 7, 6, 5, 9, 8, 2, 1, 0, 4, 3),
- ( 8, 7, 6, 5, 9, 3, 2, 1, 0, 4),
- ( 9, 8, 7, 6, 5, 4, 3, 2, 1, 0));
-
- PermTable : ARRAY [0..9, 0..9] OF INTEGER =
- (( 0, 1, 2, 3, 4, 5, 6, 7, 8, 9),
- ( 1, 5, 7, 6, 2, 8, 3, 0, 9, 4),
- ( 5, 8, 0, 3, 7, 9, 6, 1, 4, 2),
- ( 8, 9, 1, 6, 0, 4, 3, 5, 2, 7),
- ( 9, 4, 5, 3, 1, 2, 6, 8, 7, 0),
- ( 4, 2, 8, 6, 5, 7, 3, 9, 0, 1),
- ( 2, 7, 9, 3, 8, 0, 6, 4, 1, 5),
- ( 7, 0, 4, 6, 9, 1, 3, 2, 5, 8),
- ( 8, 1, 2, 3, 4, 5, 6, 7, 8, 9),
- ( 9, 5, 7, 6, 2, 8, 3, 0, 9, 4));
-
- InverseTable : ARRAY [0..9] OF INTEGER =
- ( 0, 4, 3, 2, 1, 5, 6, 7, 8, 9);
- VAR
- Check, i : INTEGER;
- BEGIN
- Check := 0;
- FOR i := 1 TO n
- DO Check := MultTable[Check, PermTable[(i MOD 8), a[i]]];
- MakeCheck := InverseTable[Check];
- END;
-
- FUNCTION VerifyCheck(a : InfoDigits; n : INTEGER) : BOOLEAN;
- { This will verify Verhoeff's Diheral Five check digit. Note
- that it is different from the generator }
- CONST
- MultTable : ARRAY [0..9, 0..9] OF INTEGER =
- (( 0, 1, 2, 3, 4, 5, 6, 7, 8, 9),
- ( 1, 2, 3, 4, 0, 6, 7, 8, 9, 5),
- ( 2, 3, 4, 0, 1, 7, 8, 9, 5, 6),
- ( 3, 4, 0, 1, 2, 8, 9, 5, 6, 7),
- ( 4, 0, 1, 2, 3, 9, 5, 6, 7, 8),
- ( 5, 9, 8, 7, 6, 0, 4, 3, 2, 1),
- ( 6, 5, 9, 8, 7, 1, 0, 4, 3, 2),
- ( 7, 6, 5, 9, 8, 2, 1, 0, 4, 3),
- ( 8, 7, 6, 5, 9, 3, 2, 1, 0, 4),
- ( 9, 8, 7, 6, 5, 4, 3, 2, 1, 0));
-
- PermTable : ARRAY [0..9, 0..9] OF INTEGER =
- (( 0, 1, 2, 3, 4, 5, 6, 7, 8, 9),
- ( 1, 5, 7, 6, 2, 8, 3, 0, 9, 4),
- ( 5, 8, 0, 3, 7, 9, 6, 1, 4, 2),
- ( 8, 9, 1, 6, 0, 4, 3, 5, 2, 7),
- ( 9, 4, 5, 3, 1, 2, 6, 8, 7, 0),
- ( 4, 2, 8, 6, 5, 7, 3, 9, 0, 1),
- ( 2, 7, 9, 3, 8, 0, 6, 4, 1, 5),
- ( 7, 0, 4, 6, 9, 1, 3, 2, 5, 8),
- ( 8, 1, 2, 3, 4, 5, 6, 7, 8, 9),
- ( 9, 5, 7, 6, 2, 8, 3, 0, 9, 4));
- VAR
- Check, i : INTEGER;BEGIN
- Check := 0;
- FOR i := 1 TO n
- DO Check := MultTable[Check, PermTable[(i MOD 8), a[i]]];
- VerifyCheck := (Check = 0);
- END;
-
- .PAGE
- Bull Function :
-
- FUNCTION BullCheck(a : InfoDigits; n, x, y : INTEGER) : INTEGER;
- { The most popular pairs (x, y), in order of increasing error
- detection ability, are (4,5), (4,7), (3,7), (3,5), (5,6) and
- (3,8). }
- VAR
- CheckX, CheckY, i : INTEGER;
- BEGIN
- CheckX := 0;
- CheckY := 0;
- FOR i := 1 TO n
- DO IF (Odd(i))
- THEN CheckX := CheckX + a[i]
- ELSE CheckY := CheckY + a[i];
- BullCheck := (CheckX MOD X)+ (CheckY MOD Y)
- END;
-
- .PAGE
- Power Function :
-
- FUNCTION PowerCheck(a : InfoDigits; base, x : INTEGER) : INTEGER;
- { base is usually 2 or 3. x is usually 7, 10 or 11. }
- VAR
- Check, i, Term : INTEGER;
- BEGIN
- Check := 0;
- Term := 1;
- FOR i := 1 TO n
- DO BEGIN
- Check := Check + (Term * a[i]);
- Term := Term * base;
- END;
- PowerCheck := (Check MOD x)
- END;
-
- .PAGE
- ISBN Function :
-
- FUNCTION ISBNCheck(a : InfoDigits) : INTEGER;
- VAR
- Check, i : INTEGER;
- BEGIN
- Check := 0;
- FOR i := 1 TO n
- DO Check := Check + (i * a[i]);
- ISBNCheck := (Check MOD 11)
- { Let calling program handle a value of 10
- as it wishes. }
- END;
-
- --END--
-
- Title: CHECK DIGIT PROGRAMS
- Words: 325
- Date: 1990 May 02
- Sent to:
- C Users Journal
- R&D Publications
- 2601 Iowa Street
- Lawrence, KS 66047